/*************************************************************************
	> File Name: oj-44.cpp
	> Author: Wang Bo
	> Mail: 1276106221@qq.com
<<<<<<< Updated upstream
	> Created Time: 2020年12月30日 星期三 14时46分12秒
 ************************************************************************/
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n, cnt = 0;
    cin >> n;
    vector<int> nums(n, 0), deck(n, 0);
    for (int i = 0; i < n; ++i) {
        cin >> nums[i];
    }
    //patient sort 算法 O(nlogn)
    for (int i = 0; i < n; ++i) {
        int cur_num = nums[i]; //遍历每一数字
        int l = 0, r = cnt; //设定查找边界
        while (l < r) {
            int mid = (l + r) >> 1;
            if (deck[mid] >= cur_num) r = mid;
            else l = mid + 1;
        }
        if (l == cnt) cnt++; 
        //如果范围内都小于当前数字，新开一个位置来放置该数
        deck[l] = cur_num; //否则数字覆盖
    }
    cout << cnt << endl;
    return 0;
}
/*=======
	> Created Time: 2020年12月27日 星期日 20时10分19秒
 ************************************************************************
#include <iostream>
#include <cstdio>
using namespace std;
#define MAX_N 1000000
int arr[MAX_N + 5];
int dp[MAX_N + 5];

int main() {
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) {
        scanf("%d", arr + i);
    }
    int ans = 0;
    for (int i = 0; i < n; ++i) {
        dp[i] = 1;
        for (int j = 0; j < i; ++j) {
            if (arr[j] >= arr[i]) continue;
            dp[i] = max(dp[i], dp[j] + 1);
        }
        ans = max(ans, dp[i]);
    }
    cout << ans << endl;
>>>>>>> Stashed changes
    return 0;
}
    */
